#include <stdio.h>
#include <sys/types.h>
#include <unistd.h>

int g_val = 10;

int main()
{
    pid_t id = fork();
    if(id == 0)
    {
        int cnt = 0;
        while(1)
        {
            printf("子进程：g_val=%d,g_val的地址：%p\n",g_val,&g_val);
            sleep(1);
            cnt++;
            if(cnt == 5)
            {
                g_val = 20;
            }
        }
    }
    else
    {
        while(1)
        {
            printf("父进程：g_val=%d,g_val的地址：%p\n",g_val,&g_val);
            sleep(1);
        }
    }
    return 0;
}

// int g_unval;//未初始化
// int g_val = 0;//初始化

// int main(int argc,char* argv[],char* env[])
// {
//     printf("------------------验证代码的地址是否和图内的规则一样从低到高--------------\n");
//     printf("代码区的地址：%p\n",main);
//     printf("初始化的地址：%p\n",&g_val);
//     printf("未初始化的地址：%p\n",&g_unval);
//     int *p = (int*)malloc(sizeof(int));
//     printf("堆区的地址：%p\n",p);
//     printf("栈区的地址：%p\n",&p);
//     printf("命令行参数的地址:%p\n",argv[0]);
//     printf("环境变量的地址:%p\n",env[0]);

//     printf("------------------验证堆区和栈区的增长方向--------------\n");
//     //验证堆区的增长方向
//     int* heap1 = (int*)malloc(sizeof(int));
//     int* heap2 = (int*)malloc(sizeof(int));
//     int* heap3 = (int*)malloc(sizeof(int));
//     int* heap4 = (int*)malloc(sizeof(int));
//     printf("堆区的增长方向：%p\n",heap1);
//     printf("堆区的增长方向：%p\n",heap2);
//     printf("堆区的增长方向：%p\n",heap3);
//     printf("堆区的增长方向：%p\n",heap4);

//     //验证栈区的增长方向
//     printf("栈区的增长方向：%p\n",&heap1);
//     printf("栈区的增长方向：%p\n",&heap2);
//     printf("栈区的增长方向：%p\n",&heap3);
//     printf("栈区的增长方向：%p\n",&heap4);

//     free(p);
//     free(heap1);
//     free(heap2);
//     free(heap3);
//     free(heap4);
//     return 0;
// }
